#include <mutex>
//懒汉模式多线程加锁：将非线程安全的地方锁住

//这种写法性能非常低下，因为每次调用instance()都会加锁释放锁，而这个步骤只有在第一次new Singleton()才是有必要的，
//只要p被创建出来了，不管多少线程同时访问，使用if (p == nullptr) 进行判断都是足够的（只是读操作，不需要加锁）
//没有线程安全问题，加了锁之后反而存在性能问题。
class Singleton
{
public:
	Singleton* GetInstance();
private:
	static Singleton* p;
	Singleton() = default;
	std::mutex mutex_;// new
};
Singleton* Singleton::p = nullptr;

Singleton* Singleton::GetInstance() {
	std::lock_guard<std::mutex> lk(mutex_);// new
	if(p == nullptr)
		p = new Singleton();
	return p;
}